package com.laozj.test.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    // 队列名称
    public static final String USER_QUEUE = "USER_queue";
    // 交换机名称
    public static final String USER_EXCHANGE = "USER_exchange";
    // 路由键
    public static final String USER_ROUTING_KEY = "USER_routing_key";

    /**
     * 定义队列
     * durable: 是否持久化（队列在服务器重启后是否存在）
     * exclusive: 是否排他（仅当前连接可见，连接关闭后删除）
     * autoDelete: 是否自动删除（当最后一个消费者断开连接后删除）
     */
    @Bean
    public Queue testQueue() {
        return new Queue(USER_QUEUE, true, false, false);
    }

    /**
     * 定义直连交换机（DirectExchange）
     * 特点：消息根据路由键完全匹配才能被路由到对应的队列
     */
    @Bean
    public DirectExchange testExchange() {
        return new DirectExchange(USER_EXCHANGE, true, false);
    }

    /**
     * 绑定队列到交换机，并指定路由键
     */
    @Bean
    public Binding bindingTestQueue(Queue testQueue, DirectExchange testExchange) {
        return BindingBuilder
                .bind(testQueue)
                .to(testExchange)
                .with(USER_ROUTING_KEY);
    }

    // 配置JSON消息转换器
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}
